////////////////////////////////////////////////////////////////////////////////
//
//  FLEX USER GROUP HOKURIKU
//  Copyright 2009 Flex User Group Hokuriku
//  All Rights Reserved.
// 
//  NOTICE: Flex User Group Hokuriku permits you to use, 
//  modify, and distribute this file 
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////
package net.fxug.hokuriku.chocolat.model
{
    import net.fxug.hokuriku.chocolat.model.constants.a3tndConstants;
    import net.fxug.hokuriku.chocolat.utils.DataConvertor;

    /**
     * ATNDイベント検索の検索パラメータ
     * @see http://api.atnd.org/
     * @author hikaruworld
     * TODO ソート順の実装
     * TODO バリデーション
     */
    [Bindable]
    public class A3TNDEventSearchCriteria
    {
        //---------------------------------------------------------------------
        // 検索条件パラメータ(複数条件)
        //---------------------------------------------------------------------
        /** 検索対象イベントID */
        [ArrayElementType("int")]
        public var eventIds:Array;
        /** 検索対象キーワード(AND) */
        [ArrayElementType("String")]
        public var keywords:Array;
        /** 検索対象キーワード(OR) */
        [ArrayElementType("String")]
        public var keywordsOR:Array;
        /**
         * イベント開催年月:yyyymm
         * TODO set時にバリデーションを行う
         */
        [ArrayElementType("String")]
        public var yms:Array;
        /**
         * イベント開催年月日:yyyymmdd
         * TODO set時にバリデーションを行う
         */
        [ArrayElementType("String")]
        public var ymds:Array;
        /** 参加者のユーザID */
        [ArrayElementType("int")]
        public var userIds:Array;
        /** 参加者のニックネーム */
        [ArrayElementType("String")]
        public var nicknames:Array;
        /** 主催者のユーザID */
        [ArrayElementType("int")]
        public var ownerIds:Array;
        /** 主催者のニックネーム */
        [ArrayElementType("String")]
        public var ownerNicknames:Array;
        //---------------------------------------------------------------------
        // 検索条件パラメータ(単一条件)
        //---------------------------------------------------------------------
        /**
         * 検索の開始位置(検索結果の何件目からレスポンスを返すか指定する)
         * @default 1
         */
        public var start:int;
        /**
         * 取得件数最大値
         * 最小値:1
         * 最大値:100
         * @default 10
         */
        public var count:int;
        /**
         * レスポンス形式
         * @see net.fxug.hokuriku.chocolat.model.A3TNDEventSearchCriteria#FORMAT_XML
         * @see net.fxug.hokuriku.chocolat.model.A3TNDEventSearchCriteria#FORMAT_JSON
         * @see net.fxug.hokuriku.chocolat.model.A3TNDEventSearchCriteria#FORMAT_JSONP
         * @see net.fxug.hokuriku.chocolat.model.A3TNDEventSearchCriteria#FORMAT_ICS
         *
         * @default json
         * TODO API上本来はXML形式がデフォルトになっているが、JSONの方が処理しやすいためデフォルトがJSONになっている。
         * TODO また、実装がJSONしか書かれていないため、他のフォーマットを指定した場合はエラーをthrowsする。
         */
        private var format:String;

        /** デフォルトコンストラクタ */
        public function A3TNDEventSearchCriteria()
        {
            // 初期値の割当
            this.start = a3tndConstants.START_DEFAULT;
            this.count = 10;
            this.format = a3tndConstants.FORMAT_JSON;
        }

        /**
         * 検索パラメータから検索用のGETパラメータのQueryを生成する
         * TODO この実装には、GETパラメータ長の限界を考慮していない。
         * @return name=value&name=value形式のGETパラメータ
         */
        public function createQuery():String
        {
            var ret:String = "";
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_EVENT_ID, this.eventIds);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_KEYWORD, this.keywords);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_KEYWORD_OR, this.keywordsOR);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_YM, this.yms);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_YMD, this.ymds);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_USER_ID, this.userIds);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_NICKNAME, this.nicknames);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_OWNER_ID, this.ownerIds);
            ret += DataConvertor.convertArray(a3tndConstants.QUERY_OWNER_NICKNAME, this.ownerNicknames);

            // 単一プロパティ
            ret += a3tndConstants.QUERY_EVENT_START + "=" + this.start + "&";
            ret += a3tndConstants.QUERY_EVENT_COUNT + "=" + this.count + "&";
            ret += a3tndConstants.QUERY_EVENT_FORMAT + "=" + this.format + "&";

            return ret;
        }
    }
}